
package com.xbongbong.sys.domain.entity;

import com.xbongbong.paas.constant.PaasConstant;
import com.xbongbong.paas.toolbox.util.DateUtil;
import com.xbongbong.paas.toolbox.util.RegexUtil;
import com.xbongbong.paas.toolbox.util.StringUtil;
import com.xbongbong.paas.toolbox.wrap.Entity;
import com.xbongbong.sys.enums.RoleEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.HashSet;
import java.util.Set;


/**
 * 角色实体
 * @author kaka
 * @time 2018-8-17
 */
@Setter
@Getter
@ToString
public class RoleEntity extends Entity {

	/** Comment for <code>serialVersionUID</code> */
	private static final long serialVersionUID = 1553618261981787168L;

	//========== properties ==========

	/**
	 * 主键
	 */
	private Integer id;
	/**
	 * 角色名，英文
	 */
	private String roleName;
	/**
	 * 角色别名，可以中文，用于显示
	 */
	private String roleAlias;
	/**
	 * 权限集合
	 */
	private String permissions;
	/**
	 * 数据权限类型，5：全公司 4：自定义 3：本部门和下属部门，2本部门 1：本人
	 */
	private Integer dataPermission = 1;
	/**
	 * 公司id
	 */
	private String corpid;
	/**
	 * 创建时间
	 */
	private Integer addTime;
	/**
	 * 更新时间
	 */
	private Integer updateTime;
	/**
	 * 	是否启用，1启用，0不启用
	 */
	private Integer isUse;
	/**
	 * 删除标记
	 */
	private Integer del;
	/**
	 * paas相关权限
	 */
	private String paasPermissions;
	/**
	 * 数据权限（表单级）
	 */
	private String dataPermissionDetail;
	/**
	 * 动态权限
	 */
	private String dynamicPermissions;

	/**
	 * 扩展字段
	 * 根据manger的role找到对应的roleEntity，标记为true
	 */
	private boolean used;

	public RoleEntity() {
		del = 0;
	}

	/**
	 * 构造一个填写corpid 和 roleName 的空权限RoleEntity
	 * @param corpid 公司id
	 * @param roleName 角色名
	 */
	public RoleEntity(String corpid, String roleName) {
		super();
		int now = DateUtil.getInt();
		this.corpid = corpid;
		this.roleName = roleName;
		this.del = 0;
		this.isUse = 1;
		this.addTime = now;
		this.updateTime = now;
		this.dataPermission = 1;
		// roleAlias规则：#{corpid}_#{时间戳}
		this.roleAlias = corpid + "_" + System.currentTimeMillis();
		// 空权限
		this.paasPermissions = "";
		this.permissions = "";
	}

	/**
	 * 将该角色对应的permission字段格式化为Set<Integer>并返回
	 * @return permission字段格式化为Set<Integer>
	 */
	public Set<Integer> getPermissionIdsSet() {
		// 已设置权限
		Set<Integer> permissionIdsSet = new HashSet<>();
		// 权限处理
		String permissionStr = this.getPermissions();
		// 测试过程中出现过角色只有|的情况，兼容一下
		if (!StringUtil.isEmpty(permissionStr) && !PaasConstant.PERMISSION_DELIMITER.equals(permissionStr.trim())){
			String[] permissionIdsStr = permissionStr.substring(1, permissionStr.length() - 1).split("\\|");
			for(String permissionIdStr : permissionIdsStr) {
				//手贱输成||这种空权限可以丢弃而不是出错
				if(!StringUtil.isEmpty(permissionIdStr)) {
					permissionIdsSet.add(Integer.valueOf(permissionIdStr));
				}
			}
		}
		return permissionIdsSet;
	}

	/**
	 * 该角色是否是超级管理员或老板角色
	 * @return true 是; false 否
	 */
	public boolean isAdminOrBoss() {
		return this.id.equals(RoleEnum.ADMIN.getCode()) || this.id.equals(RoleEnum.BOSS.getCode());
	}

	public String getRoleName() {
		return RegexUtil.getVariableName(roleName);
	}
}

